package com.pointstar.dp.redis;

import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;

import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Stream;

/**
 * 测试布隆过滤器（可用于redis缓存穿透）
 *
 * @author 禾绪
 */
public class TestBloomFilter {

    private static final int TOTAL = 1000000;
    private static BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(), TOTAL);

    public static void main(String[] args) {

        // 初始化1000000条数据到过滤器中
        Stream.of(0, TOTAL).forEach(i -> bloomFilter.put(i));

        // 匹配已经在过滤器中的值，是否存在匹配失败的
        Stream.of(0, TOTAL).forEach(i -> {
            if (!bloomFilter.mightContain(i)) {
                System.out.println("已存在值，匹配失败");
            }
        });

        AtomicInteger count = new AtomicInteger(0);
        // 匹配不在过滤器中的10000个值，是否存在匹配成功的
        Stream.of(0, TOTAL).forEach(i -> {
            if (bloomFilter.mightContain(i)) {
                count.getAndIncrement();
            }
        });
        System.out.println("误伤的数量：" + count.get());
    }
}
